/*
 * Copyright (c) 2025, 大连理工大学 (Dalian University of Technology)
 *
 * Licensed under the Mulan PSL v2.
 * You can use this file according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of the License at
 *
 *     http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. SEE THE MULAN PSL v2
 * FOR MORE DETAILS.
 */

#pragma once
#include "DBManager/Common/ServiceMacro.h"
#include "DBManager/DBServiceFactory.h"
#include "DBManager/IRepository/Result/Nodal/IEIGENVECTORRepository.h"
#include "DBManager/IService/Result/Nodal/IEIGENVECTORService.h"

SG_DBMANAGER_NAMESPACE_OPEN

class DBManager_DECLSPEC EIGENVECTORService : IEIGENVECTORService
{
    using DataType = SG::DataStructure::Post::EIGENVECTORData;
    using IRepos   = IEIGENVECTORRepository;

  public:
    explicit EIGENVECTORService (DBServiceFactory* const dbServiceFactory, IRepos& repos);

    ~EIGENVECTORService () override;

    FUNCTION_POST_Add (DataType);
    FUNCTION_POST_Find (DataType);

    SG::DataStructure::Common::Status Find (const SG::DataStructure::FEM::SOLType analysisType,
                                            const SG::DataStructure::Common::Id         subcaseId,
                                            const SG::DataStructure::Common::I64        mode,
                                            std::vector<DataType>& _OUT                 entity);

    /**
     * @brief    save eigen vector result
     *
     * @param    analysisType analysis type
     * @param    subcaseId
     * @param    entity
     * @author   wxc
     * @date     2024.11.27
     */
    SG::DataStructure::Common::Status Add (const SG::DataStructure::FEM::SOLType analysisType,
                                           const SG::DataStructure::Common::Id         subcaseId,
                                           const SG::DataStructure::Common::I64        mode,
                                           const SG::DataStructure::Common::Real       time_freo_eigr,
                                           std::vector<DataType>&                      entity);

  private:
    DBServiceFactory* const m_dbServiceFactory;  ///< 数据库服务工厂
    IRepos&                 m_repository;        ///< 数据仓库
};

SG_DBMANAGER_NAMESPACE_CLOSE
